00001 <?php
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025 if ( !defined("PATH_TO_ROOT") ) {
00026 define( "PATH_TO_ROOT", "../../" );
00027 }
00028
00037 require_once (PATH_TO_ROOT."common/classes/class.output.inc.php");
00038 require_once (PATH_TO_ROOT."common/classes/class.email.inc.php");
00040 require_once (PATH_TO_ROOT."common/classes/class.dateselection.inc.php");
00042 require_once (PATH_TO_ROOT."common/classes/class.formular.inc.php");
00043 require_once (PATH_TO_ROOT."roleplay/classes/class.roleartefacts.inc.php");
00044 require_once (PATH_TO_ROOT."teams/classes/class.teamartefacts.inc.php");
00046 require_once (PATH_TO_ROOT."suchmaschine/classes/class.spider.inc.php");
00054 class PInsert {
00060 private $maxFileSize;
00066 private $forbiddenFileExtensions;
00072 private $role = null;
00078 private $team = null;
00083 public function __construct() {
00084 global $settings;
00085 if (is_numeric($settings['filemanager_max_filesize'])) $this->maxFileSize = $settings['filemanager_max_filesize'];
00086 $this->forbiddenFileExtensions = $settings['filemanager_forbidden_extensions'];
00087 if (isset($_SESSION["roleID"])) {
00088 $this->role = new Role($_SESSION["roleID"]);
00089 }
00090 if (isset($_SESSION["teamID"])) {
00091 $this->team = new Team($_SESSION["teamID"]);
00092 }
00093 }
00099 public function showForm($file_upload = false, $Buttons = 0, $copyFile = null) {
00100 global $db, $EZSQL_ERROR;
00101
00102 $MaxFileSize = $this->maxFileSize;
00103 $ForbiddenFileExtensions = $this->forbiddenFileExtensions;
00104 $time = time();
00105 $sql_add = "";
00106 $heute = getdate();
00107 $course = $_SESSION['course'];
00108 $form = new Formular();
00109
00110
00111 $calendar = new DateSelection($heute['mday'], $heute['mon'], $heute['year'], $heute['hours'], $heute['minutes']);
00112
00113 $calendar->autoUpdate = false;
00114
00115 $calendar->formName = "insert";
00116
00117 $calendar->clearStrings();
00118
00119
00120 if(isset($_GET['url'])) {
00121 $actionChecked = 'link';
00122 $linkUrl = $_GET['url'];
00123 }
00124 else {
00125 $linkUrl = '';
00126 $actionChecked = '';
00127 }
00128
00129
00130 if(isset($_GET['name']))
00131 $linkName = $_GET['name'];
00132 else
00133 $linkName = '';
00134
00135
00136
00137 $form->setFormHead("insert", "", "post", "multipart/form-data", "onsubmit=\"".(!$file_upload ? "if (document.getElementById('link_ID').checked == false && document.getElementById('folder_ID').checked == false".(($_SESSION['usergroup'] != STUDENT && $_SESSION['usergroup'] != ALUMNUS && $_SESSION['usergroup'] != SCHUELER && $_SESSION['usergroup'] != GAST) || isset($_SESSION["assistent"]) ? " && document.getElementById('ROOT_ID').checked == false" : "") .") { alert('Bitte wählen Sie, ob Sie einen Link oder Ordner erstellen wollen!'); return false; } ":
00138 "") ."if (document.getElementById('folder').value == ''".(!$file_upload && (($_SESSION['usergroup'] != STUDENT && $_SESSION['usergroup'] != ALUMNUS && $_SESSION['usergroup'] != SCHUELER && $_SESSION['usergroup'] != GAST) || isset($_SESSION["assistent"])) ? " && document.getElementById('ROOT_ID').checked == false" : "") .") { alert('Bitte wählen Sie einen Zielordner!'); return false; }\"");
00139 $form->setTemplate("<table>", "<tr valign='top'><td class='tableCell'>", "<td class='tableCell'>");
00140 if($Buttons)
00141 $form->setButtons(2, "Upload", "Ignorieren");
00142 else
00143 $form->setButtons(2, "Upload");
00144
00145 if (isset($this->role)) {
00146 $form->addRawCode("<tr><td class='message' colspan='2'>Sie nehmen zur Zeit die Rolle <strong>".Data::toHTML($this->role->getName($_SESSION["gender"]), false) ."</strong> ein.<br />Wenn Sie ".($file_upload ? "eine Datei hochladen, wird diese" : "einen Ordner oder Link erstellen, wird dieser") ." unter Ihrem Rollennamen veröffentlicht.</td></tr>");
00147 }
00148
00149 $form->addRawCode("<tr><td class='tableHead' colspan='2'>Benötigte Einstellungen</td></tr>");
00150
00151 if ($file_upload) {
00152 $form->addInput("hidden", "type", "", 1, "file");
00153 $form->addInput("hidden", "MAX_FILE_SIZE", "", 1, $MaxFileSize*1024*1024);
00154
00155 $name = (!is_null($copyFile)) ? $copyFile->getName() : "";
00156 $string = "Bitte wählen Sie eine CSV-Datei aus:<br/>";
00157 $string.= "<span class='text10'>";
00158 $string.= "</span>";
00159 $form->addInput("file", "userfile", $string, 34);
00160 }
00161 $form->addButtons();
00162 echo $form->getForm(1);
00163 }
00174 public function printSubFolder($fileID, $sql_add, &$folderArr, $COUNT = 0, $layer = "··") {
00175 global $db;
00176 $folders = $db->get_results("SELECT fileID, link, student_write, userID FROM filelist WHERE parent_object='".$fileID."' AND courseID=".$_SESSION['course']." AND type='folder' $sql_add ORDER BY name");
00177 if ($folders) foreach($folders as $folder) {
00178 $folderArr[$COUNT][0] = $layer." • ".Data::toHTML($folder->link, false);
00179 $folderArr[$COUNT++][1] = $folder->fileID;
00180 $COUNT = $this->printSubFolder($folder->fileID, $sql_add, $folderArr, $COUNT, $layer."··");
00181 }
00182 return $COUNT;
00183 }
00190 public function fileSizeOK($size) {
00191 if ($this->maxFileSize) {
00192 if (($size/1000000) > $this->maxFileSize) return false;
00193 if ($size <= 0) return false;
00194 }
00195 return true;
00196 }
00203 public function fileExtOK($name) {
00204 if ($this->forbiddenFileExtensions) {
00205 $pos = strrpos($name, ".");
00206 if ($pos) {
00207 $ext = substr($name, $pos+1);
00208 if (is_array($this->forbiddenFileExtensions)) {
00209 foreach($this->forbiddenFileExtensions as $value) {
00210 if (strtolower($ext) == strtolower($value)) return false;
00211 }
00212 } elseif (strtolower($ext) == strtolower($this->forbiddenFileExtensions)) return false;
00213 }
00214 }
00215 return true;
00216 }
00224 public function sendEmail($fileID, $toTeachers = false) {
00225 global $db, $settings;
00226 if (!is_numeric($fileID)) return false;
00227 $file = $db->get_row("SELECT * FROM filelist WHERE fileID='$fileID'");
00228 if ($file) {
00229 $email = new Email($_SESSION['userid']);
00230 if ($toTeachers) {
00231 if ($file->courseID == 0) {
00232 $query = "SELECT ID FROM user WHERE Usergroup=3";
00233 } else {
00234 $query = "SELECT ID
00235 FROM user JOIN user_course ON ID=userID
00236 WHERE courseID='".$file->courseID."' AND
00237 ((differentUsergroup=0 AND Usergroup=3) OR differentUsergroup=3)";
00238 }
00239 } else {
00240 if ($file->courseID == 0) {
00241 $query = "SELECT ID FROM user WHERE Invisible=0";
00242 } else {
00243 $query = "SELECT userID FROM user_course WHERE courseID ='".$file->courseID."'";
00244 }
00245 }
00246 $users = $db->get_col($query);
00247 if ($file->courseID > 0) {
00248 $courseName = $db->get_var("SELECT Name FROM courses WHERE ID='".$file->courseID."'");
00249 }
00250 $user = $db->get_row("SELECT Vorname, Nachname FROM user WHERE ID='".$file->userID."'");
00251 $subject = $settings["label"].": Neue Ressource im ".(empty($courseName) ? "Foyer" : "Kurs \"$courseName\"");
00252 $message = "Guten Tag,\n\n".$user->Vorname." ".$user->Nachname." hat ".($file->type == "link" ? "einen neuen Link" : ($file->type == "file" ? "eine neue Datei" : "einen neuen Ordner")) ." mit der Bezeichnung\n\n\t".$file->name.(empty($file->description) ? "" : "\n\n\t".$file->description) ."\n\nim ".(empty($courseName) ? "Foyer" : "Kurs \"$courseName\"") ." bereitgestellt".($file->type == "link" ? ":\n\n\t<".$file->link.">" : ".") ."\n\nViele Grüße,\n\nIhr Kursdozent";
00253 return $email->sendMessageToUser($subject, $users, $message);
00254 }
00255 return false;
00256 }
00263 public function resolveForm($data) {
00264 global $db, $EZSQL_ERROR;
00265 echo "<table>";
00266
00267 if ($data['link'] == "") {
00268 switch ($data['type']) {
00269 case 'ROOT':
00270 case 'folder':
00271 $ERROR = "Sie haben keinen Ordnernamen angegeben!";
00272 break;
00273
00274 case 'link':
00275 $ERROR = "Sie haben keinen Link angegeben!";
00276 break;
00277
00278 case 'file':
00279 $ERROR = "Sie haben keine Datei ausgewählt!";
00280 break;
00281 }
00282 Output::errorMessage($ERROR, 2);
00283 }
00284 if ($data['name'] == "") {
00285 switch ($data['type']) {
00286 case 'ROOT':
00287 case 'folder':
00288 $ERROR = "Sie haben keinen erläuternden Ordnernamen (Tooltip) angegeben!";
00289 break;
00290
00291 case 'link':
00292 $ERROR = "Sie haben keinen Namen für den Link angegeben!";
00293 break;
00294
00295 case 'file':
00296 $ERROR = "Sie haben keinen Namen für die Datei angegeben!";
00297 break;
00298 }
00299 if (!empty($ERROR)) Output::errorMessage($ERROR, 2);
00300 }
00301 if ($data['parent_object'] == "" && $data['type'] != 'ROOT') {
00302 $ERROR = "Sie haben keinen Zielordner ausgewählt!";
00303 Output::errorMessage($ERROR, 2);
00304 }
00305 if ($data['type'] == 'link') {
00306 if (!Utilities::validateURL($data['link'])) {
00307 $ERROR = "Sie haben eine ungültige URL angegeben!";
00308 Output::errorMessage($ERROR, 2);
00309 }
00310 if (strlen($data['name']) > 40) {
00311 $ERROR = "Linkname darf höchstens 40 Zeichen lang sein.";
00312 Output::errorMessage($ERROR, 2);
00313 }
00314 }
00315 if ($data['type'] == 'file') {
00316 if ($data['orig_filename'] == '' || strlen($data['extension']) > 5 || strlen($data['extension']) < 0) {
00317 $ERROR = "Keine Datei ausgewählt oder Dateiendung ungültig! (Länge hinter . 1-4)";
00318 Output::errorMessage($ERROR, 2);
00319 if ($data['tmpfileTmpName'] != '') unlink($data['tmpfileTmpName']);
00320 } elseif (!($this->fileSizeOK($data['size']))) {
00321 $ERROR = "Datei ist entweder über der zulässigen Größe, oder sie ist leer!";
00322 Output::errorMessage($ERROR, 2);
00323 if ($data['tmpfileTmpName'] != '') unlink($data['tmpfileTmpName']);
00324 } elseif (!($this->fileExtOK($data['orig_filename']))) {
00325 $ERROR = "Dateityp ist nicht erlaubt!";
00326 Output::errorMessage($ERROR, 2);
00327 if ($data['tmpfileTmpName'] != '') unlink($data['tmpfileTmpName']);
00328 }
00329 }
00330 if ($data['type'] == 'folder') {
00331 if (strlen($data['link']) > 20) {
00332 $ERROR = "Ordnername darf höchstens 20 Zeichen lang sein.";
00333 Output::errorMessage($ERROR, 2);
00334 }
00335 }
00336
00337 if (isset($ERROR)) {
00338 echo "</table>";
00339 return false;
00340 }
00341
00342 switch ($data['type']) {
00343 case 'ROOT':
00344 $data['type'] = 'folder';
00345 $data['parent_object'] = 0;
00346 $type = "von Hauptordner";
00347 break;
00348
00349 case 'folder':
00350 $type = "von Ordner";
00351 break;
00352
00353 case 'link':
00354 $type = "von Link";
00355 break;
00356
00357 case 'file':
00358 $type = "von Datei";
00359 break;
00360 }
00361
00362
00363 $SQL_keys = $SQL_values = '';
00364 foreach($data as $key => $value) {
00365 if (!strstr($key, "tmp")) {
00366 $SQL_keys.= $key.',';
00367 $SQL_values.= "'".Data::toMysql($value) ."',";
00368 }
00369 }
00370
00371 if ($data['type'] == 'folder' && ($db->get_var("SELECT fileID FROM filelist WHERE parent_object='".$data['parent_object']."' AND courseID =".$data['courseID']." AND link='".$data['link']."' LIMIT 1") != "")) {
00372 Output::errorMessage("Ein Ordner mit dem selben Namen existiert schon in diesem Ordner.<br/>Wählen Sie bitte einen anderen Namen.", 2);
00373 echo "</table>";
00374 return false;
00375 }
00376
00377 if ($data['type'] == 'link' && $db->get_var("SELECT fileID FROM filelist WHERE parent_object='".$data['parent_object']."' AND courseID=".$_SESSION['course']." AND link='".$data['link']."' LIMIT 1") != "") {
00378 Output::errorMessage("Ein Link mit dem selben Namen existiert bereits in diesem Ordner!", 2);
00379 echo "</table>";
00380 return false;
00381 }
00382 $SQL = "INSERT INTO filelist (".substr($SQL_keys, 0, -1) .") VALUES (".substr($SQL_values, 0, -1) .")";
00383 $errorCount = count($EZSQL_ERROR);
00384 $db->query($SQL);
00385 $data['fileID'] = $db->insert_id;
00386 if (count($EZSQL_ERROR) > $errorCount || $data['fileID'] < 0) {
00387 Output::errorMessage("Fehler beim Anlegen ".$type." in der Datenbank!");
00388 echo "</table>";
00389 return false;
00390 } elseif ($data['type'] == 'file') {
00391 if (!$this->uploadFile($data)) {
00392 $db->query("DELETE FROM filelist WHERE fileID='${data['fileID']}'");
00393 $data['fileID'] = "";
00394 Output::errorMessage("Aktion nicht erfolgreich durchgeführt!", 2);
00395 echo "</table>";
00396 return false;
00397 }
00398 }
00399 if (isset($this->role)) {
00400 RoleArtefacts::setRoleForItem(RESSOURCE, $data["fileID"], $_SESSION["roleID"]);
00401 }
00402 if (isset($this->team)) {
00403 TeamArtefacts::setTeamForItem(RESSOURCE, $data["fileID"], $_SESSION["teamID"]);
00404 }
00405 if ($data['fileID'] && $data['visible_type'] != 1 && isset($data['tmpfileVisibleList'])) {
00406
00407 $errorCount = count($EZSQL_ERROR);
00408 foreach($data['tmpfileVisibleList'] as $value) {
00409 $db->query("INSERT INTO filevisible (fileID,userID) VALUES(".$data['fileID'].",".$value.")");
00410 }
00411 if (count($EZSQL_ERROR) > $errorCount) {
00412 Output::errorMessage("Aktion nicht erfolgreich durchgeführt!", 2);
00413 echo "</table>";
00414 return false;
00415 }
00416 }
00417 if ($data['type'] != 'file') {
00418 if ($data['tmpemail'] || $data['tmpteacherEMail']) {
00419 if ($this->sendEmail($data['fileID'], ($data['tmpteacherEMail'] && !$data['tmpemail']))) Output::echoMessage("Benachrichtigungs-Mails versandt.", 2);
00420 else Output::errorMessage("Benachrichtigungs-Mails konnten nicht versandt werden!", 2);
00421 }
00422 }
00423 Output::echoMessage("Aktion wurde erfolgreich durchgeführt!", 2);
00424 echo "</table>";
00425 unset($_POST);
00426 if ($data['type'] == 'file') {
00427
00428 $spider = new Spider();
00429 $spider->start("add-file", $data['fileID']);
00430 }
00431 return $data["fileID"];
00432 }
00440 private function uploadFile($data) {
00441 global $settings;
00442
00443 $uploaddir = PATH_TO_ROOT.$settings["upload_path"].'filemanager/courseID/'.$data['courseID'].'/';
00444
00445 if (!(is_dir($uploaddir))) Utilities::mkdir_r($uploaddir);
00446 $uploadSuccess = false;
00447
00448 if (isset($data['tmpfileTmpName'])) {
00449 $uploadSuccess = move_uploaded_file($data['tmpfileTmpName'], $uploaddir.$data['link']);
00450 } else if (isset($data['tmpPathToFile'])) {
00451 $uploadSuccess = copy( $data['tmpPathToFile'], $uploaddir.$data['link'] );
00452 }
00453 if ( $uploadSuccess ) {
00454 if ($data['tmpemail'] || $data['tmpteacherEMail']) {
00455 if ($this->sendEmail($data['fileID'], ($data['tmpteacherEMail'] && !$data['tmpemail']))) Output::echoMessage("Benachrichtigungs-Mails versandt.", 1);
00456 else Output::errorMessage("Benachrichtigungs-Mails konnten nicht versandt werden!", 1);
00457 }
00458 Output::echoMessage("Datei erfolgreich gesendet", 1);
00459 return true;
00460 } else {
00461 Output::errorMessage("Fehler beim Senden der Datei aufgetreten!", 1);
00462 return false;
00463 }
00464 }
00465 }
00466 ?>